/**
 * 日志工具函数模块
 * 提供各种通用的工具函数，供日志系统其他模块使用
 */

const fs = require('fs');
const path = require('path');

/**
 * 确保目录存在，如果不存在则创建
 * @param {string} directoryPath - 目录路径
 * @returns {boolean} - 是否成功创建或目录已存在
 */
function ensureDirectoryExists(directoryPath) {
  try {
    if (!fs.existsSync(directoryPath)) {
      // 递归创建目录
      fs.mkdirSync(directoryPath, { recursive: true });
    }
    return true;
  } catch (error) {
    console.error('创建目录失败:', error);
    return false;
  }
}

/**
 * 生成唯一的请求ID
 * @returns {string} - 请求ID
 */
function generateRequestId() {
  const timestamp = Date.now().toString(36);
  const randomString = Math.random().toString(36).substring(2, 9);
  return `${timestamp}-${randomString}`;
}

/**
 * 格式化日期
 * @param {Date} date - 日期对象
 * @param {string} format - 格式化模板
 * @returns {string} - 格式化后的日期字符串
 */
function formatDate(date, format) {
  if (!date || !(date instanceof Date)) {
    date = new Date();
  }
  
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
  
  return format
    .replace('yyyy', year)
    .replace('MM', month)
    .replace('dd', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds)
    .replace('SSS', milliseconds);
}

/**
 * 获取文件大小（带单位）
 * @param {number} bytes - 字节数
 * @returns {string} - 格式化后的文件大小
 */
function formatFileSize(bytes) {
  if (bytes === 0) return '0 Bytes';
  
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

/**
 * 安全地解析JSON字符串
 * @param {string} jsonString - JSON字符串
 * @param {any} defaultValue - 解析失败时的默认值
 * @returns {any} - 解析结果或默认值
 */
function safeJSONParse(jsonString, defaultValue = null) {
  try {
    return JSON.parse(jsonString);
  } catch (error) {
    console.error('JSON解析失败:', error);
    return defaultValue;
  }
}

/**
 * 获取客户端IP地址
 * @param {object} req - Express请求对象
 * @returns {string} - IP地址
 */
function getClientIP(req) {
  return req.headers['x-forwarded-for'] || 
         req.headers['x-real-ip'] || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress || 
         'unknown';
}

/**
 * 截断长字符串
 * @param {string} str - 原始字符串
 * @param {number} maxLength - 最大长度
 * @returns {string} - 截断后的字符串
 */
function truncateString(str, maxLength = 1000) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  
  if (str.length <= maxLength) {
    return str;
  }
  
  return str.substring(0, maxLength) + '... (truncated)';
}

/**
 * 获取当前环境
 * @returns {string} - 环境名称（development/production/test）
 */
function getEnvironment() {
  return process.env.NODE_ENV || 'development';
}

/**
 * 判断是否为生产环境
 * @returns {boolean} - 是否为生产环境
 */
function isProduction() {
  return getEnvironment() === 'production';
}

/**
 * 判断是否为开发环境
 * @returns {boolean} - 是否为开发环境
 */
function isDevelopment() {
  return getEnvironment() === 'development';
}

/**
 * 生成关联ID
 * @returns {string} - 关联ID
 */
function generateCorrelationId() {
  const timestamp = Date.now().toString(36);
  const randomString = Math.random().toString(36).substring(2, 15);
  return `${timestamp}-${randomString}`;
}

module.exports = {
  ensureDirectoryExists,
  generateRequestId,
  formatDate,
  formatFileSize,
  safeJSONParse,
  getClientIP,
  truncateString,
  getEnvironment,
  isProduction,
  isDevelopment,
  generateCorrelationId
};